function os.sleep(timeout)
  checkArg(1, timeout, "number", "nil")
  local deadline = computer.uptime() + (timeout or 0)
  repeat
    computer.pullSignal(deadline - computer.uptime())
  until computer.uptime() >= deadline
end

local rsid = component.list("redstone", true)()
local rs = component.proxy(rsid)

local siderail = 4  -- east
local sidedoors = 5 -- west
local sideread = 1  -- top
local holdfor = 10
local delay = 2

while true do
  local e, a, b, c = computer.pullSignal("redstone_changed")
  computer.beep(700)
  computer.beep(750)
  rs.setOutput(sidedoors, 15)
  os.sleep(7)
  computer.beep(500)
  os.sleep(1)
  computer.beep(550)
  os.sleep(1)
  computer.beep(600)
  os.sleep(1)
  rs.setOutput(sidedoors, 0)
  os.sleep(2)
  rs.setOutput(siderail, 15)
  os.sleep(1)
  rs.setOutput(siderail, 0)

  -- catch the second redstone event
  computer.pullSignal()
end